<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    // 递归：函数自己调用自己，在使用时一定注意结束条件
    // function test() {
    //   test()
    // }
    // test()

    // 求第n个数的斐波那契数列的值 fibonacci(4)
    // 1 2 3 4 5 6 7
    // 1 1 2 3 5 8 13
    // fibonacci(1) = 1
    // fibonacci(2) = 1
    // fibonacci(3) = fibonacci(2) + fibonacci(1)
    // fibonacci(4) = fibonacci(3) + fibonacci(2)
    // fibonacci(n) = fibonacci(n - 1) + fibonacci(n - 2)

    // 基础版，但是有问题，性能太低，很多值都在重复地进行运算。
    // function fibonacci(n) {
    //   if (n <= 2) {
    //     return 1
    //   }
    //   return fibonacci(n - 1) + fibonacci(n - 2)
    // }

    // 进阶版 将已经算过的值用一个对象缓存起来。下一次在计算同样的值时，只需要从缓存中取值就行了
    function fibonacci(n, memo = {}) {
      if (n <= 2) return 1
      // 如果对象中存在对应的值，就直接返回这个值
      if (memo[n]) return memo[n]
      // 如果没有的话，就计算这个值，并缓存在对象中
      return memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo)
    }
    fibonacci(11)



    // 数组求和 sum(arr)
    // arr[第一项] + sum(后面项的数组)
    // arr[第一项] + arr1[后面项的数组第一项] + sum(剩余项组成的数组)
    // 4 + sum([5, 6, 1, 9, 10, 11, 33, 56])
    // 4 + 5 + sum([6, 1, 9, 10, 11, 33, 56])
    // 4 + 5 + 6 + sum([1, 9, 10, 11, 33, 56])
    // 4 + 5 + 6 + 1 + sum([9, 10, 11, 33, 56])

    let arr = [4, 5, 6, 5]
    function sum(arr) {
      if (arr.length === 1) return arr[0]
      // 转为数组第一项的值 加上后面所有数组的和
      return arr[0] + sum(arr.slice(1))
    }
    let res2 = sum(arr)
    console.log(res2);


    // 终极练习：扁平化数组转树形结构
    let data = [
      {
        id: 1,
        pid: null,
        name: '传智播客'
      },
      {
        id: 11,
        pid: 1,
        name: '前端'
      },
      {
        id: 111,
        pid: 11,
        name: '重庆前端'
      },
      {
        id: 12,
        pid: 1,
        name: 'java'
      }
    ]

    // [
    //   {
    //     id: 1,
    //     pid: null,
    //     name: '传智播客',
    //     children: [
    //       { id: 11, pid: 1, name: '前端' },
    //       { id: 12, pid: 1, name: 'java' }
    //     ]
    //   }

    function findChildren(data, pid = null) {
      // children是数组 同时肯定需要遍历data
      return data.filter(item => {
        if (item.pid === pid) {
          item.children = findChildren(data, item.id)
          return true
        }
      })

      // // 高级点的写法 （不要求掌握）
      // return data
      //   .filter(item => item.pid === id)
      //   .map(item => ({...item, children: findChildren(data, item.id)}) )

    }
    let res = findChildren(data)
    console.log(res);











    function fun(n, o) {
      console.log(o)
      return {
        fun: function (m) {
          return fun(m, n);
        }
      }
    }
    // var a = fun(0); // undefined
    // a = {
    //   fun: function (m) {
    //     return fun(m, 0);
    //   }
    // }
    // a.fun(1); // 0
    // a.fun(2); // 0
    // a.fun(3); // 0


    // fun( 1, 0) fun(2, 1)
    // var b = fun(0).fun(1).fun(2).fun(3); // undefined 0 1 2


    var c = fun(0).fun(1); // fun(1, 0)  // undefined 0
    c.fun(2); // fun(2, 1) // 1
    c.fun(3); // fun(3, 1) // 1


    // let arr4 = [2,3,445,32,2,456]
    // // 将大于30的数返回，组成一个新数组
    // let res4 = arr4.filter(item => {
    //   if(item > 30) {
    //     return true
    //   }
    // })
    // console.log(res4);
  </script>
</body>

</html>